﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;


namespace Banesco.Logica
{
    public class HelperWSAPCServices
    {
        ///<summary>
        /// Operacion utilizada para recuperar informacion del cliente a APC
        /// </summary>
        public void APC_ObtenerInformacionCliente(ref string resultado, string user, string password, string identificacionCliente, string tipoCliente)
        {
            APCEncryptLibrary.EncryptDecrypt objEncriptador = new APCEncryptLibrary.EncryptDecrypt();
            XmlDocument objXMLResultado = new XmlDocument();
            XPathNavigator objNavigator;
            resultado = string.Empty;

            byte[] bllave = new byte[24];
            byte[] bVector = new byte[16];

            objEncriptador.GenerarLlave(ref bllave, bVector);

            string userEncriptado = this.Encriptador(user, ref objEncriptador, ref bllave, ref bVector);
            string passwordEncriptado = this.Encriptador(password, ref objEncriptador, ref bllave, ref bVector);
            string tipoClienteEncriptado = this.Encriptador(tipoCliente, ref objEncriptador, ref bllave, ref bVector);

            System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();//Originalmente
            string identificacionClienteEncriptado = this.Encriptador(identificacionCliente, ref objEncriptador, ref bllave, ref bVector);
            ServicesIntegracionAPC.genericService objAPCGenericServices = new ServicesIntegracionAPC.genericService();
            try
            {
                resultado = objAPCGenericServices.Score(userEncriptado, passwordEncriptado, identificacionClienteEncriptado, tipoClienteEncriptado, string.Empty);

                objXMLResultado.LoadXml(resultado);

                objNavigator = objXMLResultado.CreateNavigator();
                objNavigator.MoveToFirst();
                resultado = string.Empty;
                this.DesencriptarMensaje(ref resultado, objNavigator, ref objEncriptador, ref bllave, ref bVector);
            }
            catch (Exception ex)
            { }

        }

        private string Encriptador(string cadenaEncriptar, ref APCEncryptLibrary.EncryptDecrypt objEncriptador, ref byte[] bllave, ref byte[] bVector)
        {
            string valorEncriptado = string.Empty;


            try
            {
                valorEncriptado = objEncriptador.Encrypt(cadenaEncriptar, bllave, bVector);

            }
            catch (Exception ex)
            { }

            return valorEncriptado;

        }

        private void DesencriptarMensaje(ref string cad_xml, XPathNavigator nav, ref APCEncryptLibrary.EncryptDecrypt objEncriptador, ref byte[] bllave, ref byte[] bVector)
        {
            string cad_desenc = string.Empty;
            string valenc = string.Empty;

            //operación según el tipo de nodo

            switch (nav.NodeType)
            {
                case XPathNodeType.Element:
                    if ((nav.Prefix == String.Empty))
                    {
                        if ((nav.HasChildren == true))
                        {
                            //abrir nodo
                            cad_xml = cad_xml + "<" + nav.LocalName.ToUpper() + ">";
                        }
                        else
                        {
                            //abrir nodo vacio
                            cad_xml = cad_xml + "<" + nav.LocalName.ToUpper() + "/>";
                        }
                    }
                    else
                    {
                        cad_xml = cad_xml + "<" + nav.LocalName.ToUpper() + nav.NamespaceURI + nav.Prefix + "/>";
                    }
                    break;
                case XPathNodeType.Text:
                    //desencriptar el texto
                    cad_desenc = objEncriptador.Decrypt(nav.Value, bllave, bVector);
                    cad_xml = cad_xml + cad_desenc;

                    //Case XPathNodeType.Root
                    //    nav.MoveToFirstChild()
                    break;
            }

            //moverse al primer hijo
            if (nav.MoveToFirstChild())
            {
                //moverse al seguiente nodo
                do
                {
                    DesencriptarMensaje(ref cad_xml, nav, ref objEncriptador, ref bllave, ref bVector);
                }
                while (nav.MoveToNext());
                //moverse al nodo padre
                nav.MoveToParent();
                //cerrar nodo
                if (nav.NodeType == XPathNodeType.Element)
                {
                    cad_xml = cad_xml + "</" + nav.Name.ToUpper() + ">";
                }
            }

        }

    }

    #region Clase para validar certificado digital
    public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
    {
        public bool CheckValidationResult(System.Net.ServicePoint srvPoint, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Net.WebRequest request, int certificateProblem)
        {
            return true;
        }
    }
    #endregion
}
